package com.itheima.exception;

import com.itheima.common.R;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 全局异常处理器
 *
 */
@RestControllerAdvice
public class GlobalExceptionHandler {

    //一个方法出来一个特定的异常类

    /**
     * 最后的保险,范围最大的异常类,其他捕获失效的时候就会进入这里
     * @param ex 异常类对象
     * @return 将所需的异常信息返回给前端
     */
    @ExceptionHandler(Exception.class) //指定能够处理的异常类型为最大的异常类,最后的保险
    public R exception(Exception ex){
        ex.printStackTrace();////打印堆栈中的异常信息到控制台
        //捕获到异常之后，响应一个标准的R
        return R.error("服务器正忙,请联系管理员!");
    }

    /**
     * 捕获运行时异常,并将所需的异常信息返回给前端
     * @param ex 异常类对象
     * @return 将所需的异常信息返回给前端
     */
    @ExceptionHandler(RuntimeException.class)
    public R runTimeException(RuntimeException ex){
        ex.printStackTrace();
        return R.error(ex.getMessage());
    }


    /**
     * 捕获前端添加和修改数据经常出现的因unique字段限制导致的重复异常
     * @param ex 异常类对象
     * @return 将所需的异常信息返回给前端
     */
    @ExceptionHandler(DuplicateKeyException.class)
    public R DuplicateKeyException(DuplicateKeyException ex){
        ex.printStackTrace();
        String exceptionMsg = ex.getCause().toString();
        //根据异常信息提示的格式,截取有效信息返回给前端
        return R.error(exceptionMsg.substring(exceptionMsg.indexOf(":", 2) + 1));
    }

}
